module.exports = (option, app) => {
	return async (ctx, next) => {
		// 1、 获取token
		let token = ctx.header.token || ctx.query.token
		//const { token } = ctx.header
		// console.log(token)
		if(!token){
		  //  if(ctx.websocket) ctx.websocket.close()
			ctx.throw(400, '没有权限访问！')
			
		}
		// 2.token解密，获取用户信息
		let user = {};
		try{
			user = await ctx.checkToken(token);
		}catch(e){
		  //  if(ctx.websocket) ctx.websocket.close()
			let fail = e.name === 'TokenExpiredError' ? 
			'token 已过期! 请重新获取令牌' : 'Token 令牌不合法!';
			ctx.throw(400, fail);
		}
		
		//3. 判断当前用户是否登录
		let t = await ctx.service.cache.get('user_' + user.id);
		// 客户端token不等于服务器缓存的token
		if (!t || t !== token) {
		  //  if(ctx.websocket) ctx.websocket.close()
				ctx.throw(400, 'Token 令牌不合法!');
		}
		
		// 4. 获取当前用户是否被禁用
		user = await app.model.User.findByPk(user.id)
		if(!user || user.status == 0){
		  //  if(ctx.websocket) ctx.websocket.close()
			ctx.throw(400, '用户不存在或已被禁用');
		}
		// 5. 把 user 信息挂载到全局ctx上
		ctx.authUser = user;
		await next();
	}
}